<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        /**
         *  和III的区别：最多可以完成k次交易，可以第0次，1次，2次，到k次

         *  输入：k = 2, prices = [2,4,1]
         *  输出：2
         *  解释：在第 1 天 (股票价格 = 2) 的时候买入，在第 2 天 (股票价格 = 4) 的时候卖出，这笔交易所能获得利润 = 4-2 = 2 。
         * 
         *  输入：k = 2, prices = [3,2,6,5,0,3]
         *  输出：7
         *  解释：在第 2 天 (股票价格 = 2) 的时候买入，在第 3 天 (股票价格 = 6) 的时候卖出, 这笔交易所能获得利润 = 6-2 = 4 。
         *  随后，在第 5 天 (股票价格 = 0) 的时候买入，在第 6 天 (股票价格 = 3) 的时候卖出, 这笔交易所能获得利润 = 3-0 = 3 。
         * 
        */
        /* 
            时间：O(n)
            空间：O(n * (2 * k + 1))
            思路：
                假设k=3
                就有第一次买入
                第一次卖出
                第二次买入
                第二次卖出
                第三次买入
                第三次卖出，总共有 3 * 2次交易
            dp[i][0] = 0
            dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i])，第i天，第一次买入股票的状态，但可能是第i-1天已经买了，然后现在是持有状态
            dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i])，第i-1天，第一次卖出股票的状态，但可能是第i-1天已经卖出了，现在是空的状态
            dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i])
            dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i])
            dp[i][5] = Math.max(dp[i - 1][5], dp[i - 1][4] - prices[i])
            dp[i][6] = Math.max(dp[i - 1][6], dp[i - 1][5] + prices[i])
        */
        var maxProfit = function(prices, k) {
            // 初始化
            let dp = new Array(prices.length).fill(0).map(() => new Array(2 * k + 1).fill(0))
            // 第0天，类比奇数是买，偶数是卖
            // 为什么在第0天要对所有的奇数进行初始化-->也就是进行多次买入卖出操作呢？
            // 因为i是依赖i-1的值，为了后续能够正确计算所有的买入卖出的可能性
            for (let j = 1; j < 2 * k; j+=2) {
                dp[0][j] = -prices[0]
            }
            let totalProfit = 0; // 初始化总利润为0
            for (let i = 1; i < prices.length; i++) { // 遍历每一天的股票作为买卖时机
                for (let j = 0; j < 2 * k - 1; j+=2) { // j=0时处理1和2，j=1时，处理3和4
                    // 类比奇数是买 偶数是卖
                    dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i])
                    dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i])
                }
            }
            return dp[prices.length - 1][2 * k]; // 返回总利润
        };
        // console.log(maxProfit([3,2,6,5,0,3], 2));
        console.log(maxProfit([1,2,3,4,5], 2));
    </script>
</body>

</html>